/*
 * SSTF.c
 *
 *  Created on: 23/10/2011
 *      Author: agustin
 */


#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/un.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/mman.h>

typedef struct Nodo {
	int elemento;
	struct Nodo *siguiente;
} nodo;

typedef nodo* cola;

int posActualCabezal = 0;
cola var_cola;

void INSERTAR_PRIMERO(int x, cola C);
void PONER_EN_COLA(int x, cola C);
cola QUITAR_DE_COLA(int* sector, cola C);
cola CREAR();

cola CREAR() {
	cola C;
	C = (nodo *) malloc(sizeof(nodo));
	C->siguiente = NULL;
	C->elemento = 0;
	return C;
}

void INSERTAR_PRIMERO(int x, cola C)

{
	C->elemento = x;
}

void PONER_EN_COLA(int x, cola C)

{
	nodo *actual, *ptr;
	actual = C;
	if ((actual->siguiente) != NULL) {
		while (abs(actual->elemento - x)
				> abs(actual->siguiente->elemento - actual->elemento)) {
			actual = actual->siguiente;
			if ((actual->siguiente) == NULL
			)
				break;
		}
		if ((actual->siguiente) != NULL) {
			if (abs(actual->elemento - x)
					== abs(actual->siguiente->elemento - actual->elemento)) {
				actual = actual->siguiente; // Si la cercania es igual decide por FIFO
			}
		}
	}
	ptr = (nodo *) malloc(sizeof(nodo));
	ptr->elemento = x;
	ptr->siguiente = actual->siguiente;
	actual->siguiente = ptr;
}

cola QUITAR_DE_COLA(int* sector, cola C) {
	cola aux;
	*sector = 0;
	if (C != NULL)
	{
		aux = C;
		*sector = aux->elemento;
		C = C->siguiente;
		free(aux);
		aux = NULL;
	};
	return C;
}

